package com.myh.cc.base

import android.content.Context
import android.databinding.DataBindingUtil
import android.databinding.ViewDataBinding
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import java.lang.reflect.ParameterizedType

/**
 * 类描述    ：
 * 创建人    ：  mayahao.
 * 创建时间   ：  2018/1/2.
 * 修改人    ：
 * 修改时间   ：
 * 修改备注   ：
 */
abstract class BaseActivity<T: ViewDataBinding,C :IBaseControl ,M: BaseModel<T,C>> : AppCompatActivity(),IModeActivity<T> {

    lateinit var mBinder: T

    lateinit var mModel: M


    /**
     * 获取 layoutId
     */
    abstract fun getLayoutId(): Int

    /**
     *初始化 视图
     */
    abstract fun initView()


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 获取databinding 对象
        mBinder = DataBindingUtil.setContentView(this,getLayoutId())


        val genType = javaClass.genericSuperclass
        val params = (genType as ParameterizedType).actualTypeArguments
        val bizClass = params[2] as Class<*>
        try {
            // 初始化
            mModel = bizClass.newInstance() as M
        } catch (e: InstantiationException) {
            e.printStackTrace()
        } catch (e: IllegalAccessException) {
            e.printStackTrace()
        }

        // 初始化 ViewModel
        mModel.setView(this)
        // 同步Activity 生命周期
        mModel.onCreate()

        if (supportActionBar != null)
            supportActionBar!!.hide()

        initView()

    }

    override fun onStart() {
        super.onStart()
        mModel.onStart()
    }

    override fun onResume() {
        super.onResume()
        mModel.onResume()
    }

    override fun onStop() {
        super.onStop()
        mModel.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
        mModel.onDestroy()
    }


    override fun getBinder(): T {

        return mBinder
    }

    override fun getContext(): Context {

        return  this
    }


    override fun showLoadingDialog() {


    }

    override fun hideLoadingDialog() {


    }
}